﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using Controller; // Brug vores class library "Controller"
using Interfaces; // Brug vores class library "Interfaces"

namespace Sorts_F1
{
    public partial class FrmStemme : Form
    {
        // Attribut
        ClsSystemController systemController;

        public FrmStemme(ClsSystemController systemController) // Modtager controlleren fra start formen
        {
            InitializeComponent();
            this.systemController = systemController; // Istedet for at instansiere en ny controller bruger vi den der bliver sendt med
            this.MinimumSize = this.MaximumSize = this.Size; // Sørg for at formen altid er den nuværende størrelse
        }

        //Henter kørenavne til comboboxene
        private void FrmValgAfKoerere_Load(object sender, EventArgs e)
        {
            foreach (var item in systemController.VisKoerere())
            {
                // henter køreliste ind i comboboxen
                cbKoerere1.Items.Add(item.Navn);

                // henter køreliste ind i comboboxen
                cbKoerere2.Items.Add(item.Navn);
            }

            // Indlæser informationer om det næste Grand Prix der ikke er afviklet i tekstboksen
            lbGrandPrixNavn.Text = systemController.VisNaesteGrandPrix().Land + ": " + systemController.VisNaesteGrandPrix().BaneNavn;
            lbGrandPrixDato.Text = systemController.VisNaesteGrandPrix().GrandPrixDatoTid.ToShortDateString();
            lbGrandPrixTid.Text = systemController.VisNaesteGrandPrix().GrandPrixDatoTid.ToShortTimeString();
            lbGrandPrixJoker.Text = systemController.VisNaesteGrandPrix().Joker.Navn;

            OpdaterFormen();

        }

        private void cbKoerere1_SelectedIndexChanged(object sender, EventArgs e)
        {
            // Hvis brugeren vælger en køre på combobox1 som er den samme køre på combobox2
            if (cbKoerere1.SelectedIndex == cbKoerere2.SelectedIndex)
            {
                MessageBox.Show("Du kan desværre ikke vælge samme køre 2 gange i samme løb");
                
                // Denne kode sikre at combobox ikke går "Out of bounds", altså forsøger at gå ud til nr 14 når der kun fx er 13 kørere.
                if (cbKoerere2.Items.Count == cbKoerere1.SelectedIndex + 1)
                {
                    // Hvis det totale antal elementer i combobox2 svarer til det valgte antal elementer i combobox1 + 1 så tælles der ned for at "undgå out of bounds"                                                 
                    cbKoerere1.SelectedIndex--;
                }

                else
                {
                    cbKoerere1.SelectedIndex++;

                }

            }
        }

        private void cbKoerere2_SelectedIndexChanged(object sender, EventArgs e)
        {
            // Hvis brugeren vælger en køre på combobox2 som er den samme køre på combobox1
            if (cbKoerere2.SelectedIndex == cbKoerere1.SelectedIndex)
            {
                MessageBox.Show("Du kan desværre ikke vælge samme køre 2 gange i samme løb");

                // Denne kode sikre at combobox ikke går "Out of bounds", altså forsøger at gå ud til nr 14 når der kun fx er 13 kørere.
                if (cbKoerere1.Items.Count == cbKoerere2.SelectedIndex + 1)
                {
                    // Hvis det totale antal elementer i combobox2 svarer til det valgte antal elementer i combobox1 + 1 så tælles der ned for at "undgå out of bounds"    
                    cbKoerere2.SelectedIndex--;
                }

                else
                {
                    cbKoerere2.SelectedIndex++;
                }

            }
        }

        private void btnTilbage_Click(object sender, EventArgs e)
        {
            this.Close(); // Lukker formen
        }

        private void btnBekræftStemme_Click(object sender, EventArgs e)
        {
            try
            {
                int medlemsNummer = systemController.AktueltMedlem.MedlemsNummer; // Henter medlemsnummer fra det aktuelle medlemsinfertaceobjekt
                int koereNummer1 = 0;
                int koereNummer2 = 0;
                int grandPrixNummer = systemController.VisNaesteGrandPrix().GrandPrixNummer; // Henter næste ikke afviklet Grand Prix

                bool checkForSeksStemmer = false;

                // Finder de kørernumre der passer til kørernavnene valgt i comboboxene
                foreach (var item in systemController.VisKoerere())
                {
                    if (cbKoerere1.Text == item.Navn)
                    {
                        koereNummer1 = item.KoereNummer;
                    }

                    if (cbKoerere2.Text == item.Navn)
                    {
                        koereNummer2 = item.KoereNummer;
                    }
                }

                // Tjekker om der allerede er 6 stemmer på en af de to valgte kørere
                foreach (var item in systemController.VisSamledeSats())
                {
                    // Hvis Samlede antal stemmer = 6 på den kører der er valgt i combobox1 ELLER (||) combobox2
                    if (item.SamledeStemme == 6 && (item.KoereNavn == cbKoerere1.Text || item.KoereNavn == cbKoerere2.Text))
                    {
                        checkForSeksStemmer = true;
                    }
                }

                // Tjekker om et medlemsnummer allerede har stemt på et grandprixnummer, OG (&&) der ikke var stemt på den valgte kører 6 gange
                if (systemController.CheckStemmeIDB(medlemsNummer, grandPrixNummer) == false && checkForSeksStemmer == false)
                {
                    systemController.UploadStemmeTilDB(medlemsNummer, systemController.VisNaesteGrandPrix().GrandPrixNummer, koereNummer1);
                    systemController.UploadStemmeTilDB(medlemsNummer, systemController.VisNaesteGrandPrix().GrandPrixNummer, koereNummer2);
                    MessageBox.Show("Din stemme er nu modtaget");

                    OpdaterFormen(); // Opdater formen med den nye stemme
                }

                // Hvis der så er stemt 6 gange på en af de valgte kørere
                else if (checkForSeksStemmer == true)
                {
                    MessageBox.Show("Du har brugt dine 6 stemmer på en af dine kørere.");
                }

                // Hvis et medlemsnummer allerede har stemt på et grandprixnummer
                else
                {
                    MessageBox.Show("Vi har allerede modtaget din stemme til dette løb");
                    OpdaterFormen();
                }

            }

            catch
            {
                MessageBox.Show("Systemet kunne ikke håndtere din handling.");
            }
        }

        public void OpdaterFormen()
        {
            lvSamledeStemme.Items.Clear(); // Clear listviewet for at være klar til at indhendte den nye opdaterede data
            systemController.OpdaterSamledeSats(systemController.AktueltMedlem.MedlemsNummer); // Download de nye samledesats for det aktuelle indloggede medlem

            // Indlæs de nye opdaterede data
            foreach (var item in systemController.VisSamledeSats())
            {
                ListViewItem lvi = new ListViewItem(); // Instansier listviewet
                lvi.SubItems[0].Text = item.KoereNavn;
                lvi.SubItems.Add(item.SamledeStemme.ToString());
                lvSamledeStemme.Items.Add(lvi); // Adder subitems til listviewet
            }
        }

    }
}
